home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #5 & #6 / Amiga Plus CD - 1995 - No. 5 and 6.iso / pd / netz / term / extras / source / term-source.lha / termInfoWindow.c < prev    next >
C/C++ Source or Header  |  1995-02-07  |  8KB  |  409 lines

  1. /*
  2. **    termInfoWindow.c
  3. **
  4. **    Status information window support routines
  5. **
  6. **    Copyright © 1990-1995 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. */
  9.  
  10. #include "termGlobal.h"
  11.  
  12. enum    {    GAD_UPDATE=1,GAD_SESSION,GAD_BYTES_IN_OUT,GAD_CONNECT_STRING,GAD_BBS_INFO,
  13.         GAD_SCREEN_SIZE,GAD_PORT_NAME,GAD_BUFFER_SIZE,GAD_MEMORY,
  14.     };
  15.  
  16. STATIC struct Process        *InfoProcess;
  17. STATIC struct LayoutHandle    *InfoHandle;
  18.  
  19.     /* LocalRefreshInfoWindow():
  20.      *
  21.      *    Refresh, i.e. redraw, the contents of the info window.
  22.      */
  23.  
  24. STATIC VOID
  25. LocalRefreshInfoWindow(VOID)
  26. {
  27.     if(InfoWindow)
  28.     {
  29.         UBYTE DummyBuffer[256];
  30.  
  31.         SPrintf(DummyBuffer,ConvNumber,BytesIn);
  32.  
  33.         LT_SetAttributes(InfoHandle,GAD_BYTES_IN_OUT,
  34.             LABX_Index,    0,
  35.             LABX_Text,    DummyBuffer,
  36.         TAG_DONE);
  37.  
  38.         SPrintf(DummyBuffer,ConvNumber,BytesOut);
  39.  
  40.         LT_SetAttributes(InfoHandle,GAD_BYTES_IN_OUT,
  41.             LABX_Index,    1,
  42.             LABX_Text,    DummyBuffer,
  43.         TAG_DONE);
  44.  
  45.         Forbid();
  46.  
  47.         if(XEmulatorBase && XEM_IO)
  48.         {
  49.             if(XEmulatorBase -> lib_Version >= 4)
  50.             {
  51.                 ULONG Result = XEmulatorInfo(XEM_IO,XEMI_CONSOLE_DIMENSIONS);
  52.  
  53.                 SPrintf(DummyBuffer,"%ld × %ld",XEMI_EXTRACT_COLUMNS(Result),XEMI_EXTRACT_LINES(Result));
  54.             }
  55.             else
  56.                 strcpy(DummyBuffer,"???");
  57.         }
  58.         else
  59.             SPrintf(DummyBuffer,"%ld × %ld",LastColumn + 1,LastLine + 1);
  60.  
  61.         Permit();
  62.  
  63.         LT_SetAttributes(InfoHandle,GAD_SCREEN_SIZE,
  64.             GTTX_Text,    DummyBuffer,
  65.         TAG_DONE);
  66.  
  67.         SPrintf(DummyBuffer,ConvNumber,BufferSpace);
  68.  
  69.         LT_SetAttributes(InfoHandle,GAD_BUFFER_SIZE,
  70.             GTTX_Text,    DummyBuffer,
  71.         TAG_DONE);
  72.  
  73.         SPrintf(DummyBuffer,ConvNumber,AvailMem(MEMF_ANY));
  74.  
  75.         LT_SetAttributes(InfoHandle,GAD_MEMORY,
  76.             GTTX_Text,    DummyBuffer,
  77.         TAG_DONE);
  78.  
  79.         LT_SetAttributes(InfoHandle,GAD_BBS_INFO,
  80.             LABX_Index,    0,
  81.             LABX_Text,    CurrentBBSName[0] ? CurrentBBSName : (STRPTR)"-",
  82.         TAG_DONE);
  83.  
  84.         LT_SetAttributes(InfoHandle,GAD_BBS_INFO,
  85.             LABX_Index,    1,
  86.             LABX_Text,    CurrentBBSNumber[0] ? CurrentBBSNumber : (STRPTR)"-",
  87.         TAG_DONE);
  88.  
  89.         LT_SetAttributes(InfoHandle,GAD_BBS_INFO,
  90.             LABX_Index,    2,
  91.             LABX_Text,    CurrentBBSComment[0] ? CurrentBBSComment : (STRPTR)"-",
  92.         TAG_DONE);
  93.  
  94.         LT_SetAttributes(InfoHandle,GAD_BBS_INFO,
  95.             LABX_Index,    3,
  96.             LABX_Text,    UserName[0] ? UserName : (STRPTR)"-",
  97.         TAG_DONE);
  98.     }
  99. }
  100.  
  101.     /* LocalCloseInfoWindow():
  102.      *
  103.      *    Close the info window.
  104.      */
  105.  
  106. STATIC VOID
  107. LocalCloseInfoWindow(VOID)
  108. {
  109.     Forbid();
  110.  
  111.     CheckItem(MEN_STATUS_WINDOW,FALSE);
  112.  
  113.     Permit();
  114.  
  115.     if(InfoHandle)
  116.     {
  117.         LT_DeleteHandle(InfoHandle);
  118.  
  119.         InfoHandle = NULL;
  120.     }
  121.  
  122.     InfoWindow = NULL;
  123. }
  124.  
  125.     /* LocalOpenInfoWindow():
  126.      *
  127.      *    Open the info window.
  128.      */
  129.  
  130. STATIC BOOLEAN
  131. LocalOpenInfoWindow(VOID)
  132. {
  133.     if(InfoHandle = LT_CreateHandleTags(Window -> WScreen,
  134.         LH_LocaleHook,    &LocaleHook,
  135.     TAG_DONE))
  136.     {
  137.         LT_New(InfoHandle,
  138.             LA_Type,    VERTICAL_KIND,
  139.         TAG_DONE);
  140.         {
  141.             LT_New(InfoHandle,
  142.                 LA_Type,    VERTICAL_KIND,
  143.             TAG_DONE);
  144.             {
  145.                 UBYTE DummyBuffer[256];
  146.  
  147.                 if(!FormatStamp(&SessionStart,NULL,NULL,DummyBuffer,FALSE))
  148.                     strcpy(DummyBuffer,"-");
  149.  
  150.                 LT_New(InfoHandle,
  151.                     LA_Type,        TEXT_KIND,
  152.                     LA_LabelID,        MSG_INFOWINDOW_SESSION_START_GAD,
  153.                     LA_ID,            GAD_SESSION,
  154.                     LA_Chars,        40,
  155.                     GTTX_Text,        DummyBuffer,
  156.                     GTTX_Border,        TRUE,
  157.                     GTTX_CopyText,        TRUE,
  158.                 TAG_DONE);
  159.  
  160.                 LT_New(InfoHandle,
  161.                     LA_Type,        XBAR_KIND,
  162.                 TAG_DONE);
  163.  
  164.                 LT_New(InfoHandle,
  165.                     LA_Type,        BOX_KIND,
  166.                     LA_ID,            GAD_BYTES_IN_OUT,
  167.                     LABX_FirstLabel,    MSG_INFOWINDOW_BYTES_RECEIVED_GAD,
  168.                     LABX_LastLabel,        MSG_INFOWINDOW_BYTES_SENT_GAD,
  169.                     LABX_ReserveSpace,    TRUE,
  170.                     LABX_DrawBox,        TRUE,
  171.                     LA_Chars,        40,
  172.                 TAG_DONE);
  173.  
  174.                 LT_New(InfoHandle,
  175.                     LA_Type,        XBAR_KIND,
  176.                 TAG_DONE);
  177.  
  178.                 LT_New(InfoHandle,
  179.                     LA_Type,        TEXT_KIND,
  180.                     LA_LabelID,        MSG_INFOWINDOW_CONNECTION_MESSAGE_GAD,
  181.                     LA_ID,            GAD_CONNECT_STRING,
  182.                     GTTX_Text,        BaudBuffer[0] ? BaudBuffer : (STRPTR)"-",
  183.                     GTTX_Border,        TRUE,
  184.                     GTTX_CopyText,        TRUE,
  185.                 TAG_DONE);
  186.  
  187.                 LT_New(InfoHandle,
  188.                     LA_Type,        BOX_KIND,
  189.                     LA_ID,            GAD_BBS_INFO,
  190.                     LABX_FirstLabel,    MSG_INFOWINDOW_BBS_NAME_GAD,
  191.                     LABX_LastLabel,        MSG_INFOWINDOW_BBS_USER_NAME_GAD,
  192.                     LABX_ReserveSpace,    TRUE,
  193.                     LABX_DrawBox,        TRUE,
  194.                     LA_Chars,        40,
  195.                 TAG_DONE);
  196.  
  197.                 LT_New(InfoHandle,
  198.                     LA_Type,        XBAR_KIND,
  199.                 TAG_DONE);
  200.  
  201.                 LT_New(InfoHandle,
  202.                     LA_Type,        TEXT_KIND,
  203.                     LA_LabelID,        MSG_INFOWINDOW_SCREEN_SIZE_GAD,
  204.                     LA_ID,            GAD_SCREEN_SIZE,
  205.                     GTTX_Border,        TRUE,
  206.                     GTTX_CopyText,        TRUE,
  207.                 TAG_DONE);
  208.  
  209.                 LT_New(InfoHandle,
  210.                     LA_Type,        TEXT_KIND,
  211.                     LA_LabelID,        MSG_INFOWINDOW_AREXX_PORT_NAME_GAD,
  212.                     LA_ID,            GAD_PORT_NAME,
  213.                     GTTX_Text,        RexxPortName,
  214.                     GTTX_Border,        TRUE,
  215.                     GTTX_CopyText,        TRUE,
  216.                 TAG_DONE);
  217.  
  218.                 LT_New(InfoHandle,
  219.                     LA_Type,        TEXT_KIND,
  220.                     LA_LabelID,        MSG_INFOWINDOW_BUFFER_SIZE_GAD,
  221.                     LA_ID,            GAD_BUFFER_SIZE,
  222.                     GTTX_Border,        TRUE,
  223.                     GTTX_CopyText,        TRUE,
  224.                 TAG_DONE);
  225.  
  226.                 LT_New(InfoHandle,
  227.                     LA_Type,        TEXT_KIND,
  228.                     LA_LabelID,        MSG_INFOWINDOW_FREE_MEMORY_GAD,
  229.                     LA_ID,            GAD_MEMORY,
  230.                     GTTX_Border,        TRUE,
  231.                     GTTX_CopyText,        TRUE,
  232.                 TAG_DONE);
  233.  
  234.                 LT_EndGroup(InfoHandle);
  235.             }
  236.  
  237.             LT_New(InfoHandle,
  238.                 LA_Type,VERTICAL_KIND,
  239.             TAG_DONE);
  240.             {
  241.                 LT_New(InfoHandle,
  242.                     LA_Type,    XBAR_KIND,
  243.                     LAXB_FullSize,    TRUE,
  244.                 TAG_DONE);
  245.  
  246.                 LT_EndGroup(InfoHandle);
  247.             }
  248.  
  249.             LT_New(InfoHandle,
  250.                 LA_Type,    HORIZONTAL_KIND,
  251.             TAG_DONE);
  252.             {
  253.                 LT_New(InfoHandle,
  254.                     LA_Type,    BUTTON_KIND,
  255.                     LA_LabelID,    MSG_V36_1414,
  256.                     LA_ID,        GAD_UPDATE,
  257.                     LA_ReturnKey,    TRUE,
  258.                     LABT_ExtraFat,    TRUE,
  259.                 TAG_DONE);
  260.  
  261.                 LT_EndGroup(InfoHandle);
  262.             }
  263.  
  264.             LT_EndGroup(InfoHandle);
  265.         }
  266.  
  267.         if(InfoWindow = LT_Layout(InfoHandle,LocaleString(MSG_INFOWINDOW_STATUS_INFORMATION_TXT),NULL,0,0,IDCMP_CLOSEWINDOW,ALIGNF_RIGHT,
  268.             LAWN_HelpHook,        &GuideHook,
  269.             WA_DepthGadget,        TRUE,
  270.             WA_CloseGadget,        TRUE,
  271.             WA_DragBar,        TRUE,
  272.             WA_RMBTrap,        TRUE,
  273.         TAG_DONE))
  274.         {
  275.             LocalRefreshInfoWindow();
  276.  
  277.             return(TRUE);
  278.         }
  279.         else
  280.         {
  281.             LT_DeleteHandle(InfoHandle);
  282.  
  283.             InfoHandle = NULL;
  284.         }
  285.     }
  286.  
  287.     return(FALSE);
  288. }
  289.  
  290. STATIC VOID __saveds
  291. StatusProcessEntry(VOID)
  292. {
  293.     struct Process *Parent = ThisProcess;
  294.  
  295.     if(LocalOpenInfoWindow())
  296.     {
  297.         struct IntuiMessage    *Message;
  298.         ULONG             MsgClass;
  299.         UWORD             MsgCode,
  300.                      MsgQualifier;
  301.         struct Gadget        *MsgGadget;
  302.         BOOLEAN             Done = FALSE;
  303.  
  304.         InfoProcess = (struct Process *)FindTask(NULL);
  305.  
  306.         Signal(Parent,SIG_HANDSHAKE);
  307.  
  308.         do
  309.         {
  310.             if(Wait(PORTMASK(InfoWindow -> UserPort) | SIG_KILL) & SIG_KILL)
  311.                 break;
  312.             else
  313.             {
  314.                 while(Message = GT_GetIMsg(InfoWindow -> UserPort))
  315.                 {
  316.                     MsgClass    = Message -> Class;
  317.                     MsgCode        = Message -> Code;
  318.                     MsgQualifier    = Message -> Qualifier;
  319.                     MsgGadget    = (struct Gadget *)Message -> IAddress;
  320.  
  321.                     GT_ReplyIMsg(Message);
  322.  
  323.                     LT_HandleInput(InfoHandle,MsgQualifier,&MsgClass,&MsgCode,&MsgGadget);
  324.  
  325.                     switch(MsgClass)
  326.                     {
  327.                         case IDCMP_CLOSEWINDOW:
  328.  
  329.                             if(!Done)
  330.                             {
  331.                                 Forbid();
  332.  
  333.                                 if(!(SetSignal(0,SIG_KILL) & SIG_KILL))
  334.                                     Parent = NULL;
  335.  
  336.                                 Done = TRUE;
  337.                             }
  338.  
  339.                             break;
  340.  
  341.                         case IDCMP_GADGETUP:
  342.  
  343.                             if(MsgGadget -> GadgetID == GAD_UPDATE)
  344.                                 LocalRefreshInfoWindow();
  345.  
  346.                             break;
  347.                     }
  348.                 }
  349.             }
  350.         }
  351.         while(!Done);
  352.  
  353.         LocalCloseInfoWindow();
  354.     }
  355.  
  356.     Forbid();
  357.  
  358.     InfoProcess = NULL;
  359.  
  360.     if(Parent)
  361.         Signal(Parent,SIG_HANDSHAKE);
  362. }
  363.  
  364. VOID
  365. CloseInfoWindow()
  366. {
  367.     Forbid();
  368.  
  369.     if(InfoProcess)
  370.     {
  371.         ClrSignal(SIG_HANDSHAKE);
  372.  
  373.         Signal(InfoProcess,SIG_KILL);
  374.  
  375.         Wait(SIG_HANDSHAKE);
  376.     }
  377.  
  378.     Permit();
  379. }
  380.  
  381. VOID
  382. OpenInfoWindow()
  383. {
  384.     Forbid();
  385.  
  386.     if(!InfoProcess)
  387.     {
  388.         if(CreateNewProcTags(
  389.             NP_Entry,    StatusProcessEntry,
  390.             NP_Name,    "term Status Window Process",
  391.             NP_Priority,    SysBase -> ThisTask -> tc_Node . ln_Pri,
  392.             NP_StackSize,    4000,
  393.             NP_WindowPtr,    -1,
  394.         TAG_END))
  395.         {
  396.             ClrSignal(SIG_HANDSHAKE);
  397.  
  398.             Wait(SIG_HANDSHAKE);
  399.         }
  400.     }
  401.  
  402.     if(InfoProcess)
  403.         CheckItem(MEN_STATUS_WINDOW,TRUE);
  404.     else
  405.         CheckItem(MEN_STATUS_WINDOW,FALSE);
  406.  
  407.     Permit();
  408. }
  409.